package main

import (
    "fmt"
    "math/rand"
    "time"
)

type CoolingSystem struct {
    OutdoorTemp       float64
    CoolingWaterPump  bool
    ChilledWaterPump  bool
    Compressor        bool
    DesiredIndoorTemp float64
}

// 修改了方法名以符合Go的编码风格
func (cs *CoolingSystem) StartCoolingWaterPump() error {
    // 使用固定的成功率来代替随机数，这里仅作为示例
    if rand.Float64() < 0.6 {
        cs.CoolingWaterPump = true
        fmt.Println("冷却水泵启动成功。")
        return nil
    } else {
        fmt.Println("冷却水泵启动失败！")
        return fmt.Errorf("冷却水泵启动失败")
    }
}

func (cs *CoolingSystem) StartChilledWaterPump() error {
    if rand.Float64() < 0.6 {
        cs.ChilledWaterPump = true
        fmt.Println("冷冻水泵启动成功。")
        return nil
    } else {
        fmt.Println("冷冻水泵启动失败！")
        return fmt.Errorf("冷冻水泵启动失败")
    }
}

func (cs *CoolingSystem) StartCompressor() error {
    if rand.Float64() < 0.6 {
        cs.Compressor = true
        fmt.Println("压缩机启动成功。")
        return nil
    } else {
        fmt.Println("压缩机启动失败！")
        return fmt.Errorf("压缩机启动失败")
    }
}

func (cs *CoolingSystem) AdjustTemperature() error {
    if rand.Float64() < 0.9 {
        fmt.Printf("室内温度调整至 %.1f°C 成功。\n", cs.DesiredIndoorTemp)
        return nil
    } else {
        fmt.Println("室内温度调整失败！")
        return fmt.Errorf("室内温度调整失败")
    }
}

// 限制重试次数以避免无限循环
func (cs *CoolingSystem) StartSequence(maxRetries int) {
    for attempt := 0; attempt < maxRetries; attempt++ {
        fmt.Println("...开始启动序列...")
        if err := cs.StartCoolingWaterPump(); err != nil {
            fmt.Println(err)
            continue
        }
        if err := cs.StartChilledWaterPump(); err != nil {
            fmt.Println(err)
            continue
        }
        if err := cs.StartCompressor(); err != nil {
            fmt.Println(err)
            continue
        }
        if err := cs.AdjustTemperature(); err != nil {
            fmt.Println(err)
            continue
        }
        fmt.Println("系统启动完毕。")
        return
    }
    fmt.Println("启动序列尝试多次后失败。")
}

func main() {
    rand.Seed(time.Now().UnixNano()) // 初始化随机种子

    cs := CoolingSystem{
        OutdoorTemp:       32.0,  // 模拟室外温度为32°C
        DesiredIndoorTemp: 24.0,  // 期望室内温度设为24°C
    }

    // 假设最大重试次数
    cs.StartSequence(10) // 启动系统
}
